/**
 * 模块生成脚本
 * 用法：node scripts/generate-module.js <模块名称> [页面名称1 页面名称2 ...]
 * 示例：node scripts/generate-module.js product list detail comment
 */

const fs = require('fs');
const path = require('path');

// 获取命令行参数
const args = process.argv.slice(2);
const moduleName = args[0]; // 第一个参数是模块名
const pages = args.slice(1); // 后续参数是页面名称列表

if (!moduleName) {
  console.error('请提供模块名称！');
  console.log('用法：node scripts/generate-module.js <模块名称> [页面名称1 页面名称2 ...]');
  console.log('示例：node scripts/generate-module.js product list detail comment');
  process.exit(1);
}

// 如果没有提供页面列表，默认创建index页面
if (pages.length === 0) {
  pages.push('index');
}

// 将名称转换为首字母大写的驼峰形式
const toPascalCase = (name) => {
  return name
    .split('-')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join('');
};

// 将名称转换为小驼峰形式
const toCamelCase = (name) => {
  const pascal = toPascalCase(name);
  return pascal.charAt(0).toLowerCase() + pascal.slice(1);
};

// 模板页面路径
const templatePath = path.join(__dirname, '../src/pages/index');
// 新模块路径
const moduleBasePath = path.join(__dirname, '../src/pages', moduleName);

// 检查模块目录是否已存在
if (fs.existsSync(moduleBasePath)) {
  console.log(`模块 ${moduleName} 已存在，将在其中添加新页面。`);
} else {
  // 创建模块基础目录
  fs.mkdirSync(moduleBasePath, { recursive: true });

  // 创建模块级目录
  ['components', 'services', 'store'].forEach(dir => {
    fs.mkdirSync(path.join(moduleBasePath, dir), { recursive: true });
    console.log(`创建目录: ${path.join(moduleBasePath, dir)}`);
  });

  // 创建模块级服务文件
  const serviceContent = `/**
 * ${toPascalCase(moduleName)}模块服务
 */

/**
 * 获取${moduleName}数据
 */
export async function get${toPascalCase(moduleName)}Data(params: any = {}) {
  try {
    // 实现具体的API调用
    return Promise.resolve({ success: true, data: [] });
  } catch (error) {
    console.error('获取${moduleName}数据失败:', error);
    return Promise.reject(error);
  }
}
`;
  fs.writeFileSync(path.join(moduleBasePath, 'services', 'index.ts'), serviceContent);
  console.log(`创建文件: ${path.join(moduleBasePath, 'services', 'index.ts')}`);

  // 创建模块级状态管理文件
  const storeContent = `/**
 * ${toPascalCase(moduleName)}模块状态
 */
import { defineStore } from 'pinia';
import { get${toPascalCase(moduleName)}Data } from '../services';

export const use${toPascalCase(moduleName)}Store = defineStore('${moduleName}', {
  state: () => ({
    loading: false,
    data: [],
  }),

  actions: {
    async fetchData(params: any = {}) {
      this.loading = true;
      try {
        const response = await get${toPascalCase(moduleName)}Data(params);
        this.data = response.data;
        return response;
      } catch (error) {
        console.error('获取${moduleName}数据失败:', error);
        return Promise.reject(error);
      } finally {
        this.loading = false;
      }
    },

    resetState() {
      this.loading = false;
      this.data = [];
    }
  }
});
`;
  fs.writeFileSync(path.join(moduleBasePath, 'store', 'index.ts'), storeContent);
  console.log(`创建文件: ${path.join(moduleBasePath, 'store', 'index.ts')}`);
}

// 需要更新的页面路径
const pagesToAdd = [];

// 循环处理每个页面
for (const page of pages) {
  const pagePath = path.join(moduleBasePath, page);

  // 检查页面是否已存在
  if (fs.existsSync(pagePath)) {
    console.warn(`⚠️ 页面 ${moduleName}/${page} 已存在，跳过创建。`);
    continue;
  }

  // 创建页面目录
  fs.mkdirSync(pagePath, { recursive: true });
  console.log(`创建目录: ${pagePath}`);

  // 创建页面配置文件
  const configContent = `export default {
  navigationBarTitleText: '${toPascalCase(moduleName)}${page !== 'index' ? '-' + toPascalCase(page) : ''}',
  usingComponents: {},
}`;
  fs.writeFileSync(path.join(pagePath, 'index.config.ts'), configContent);
  console.log(`创建文件: ${path.join(pagePath, 'index.config.ts')}`);

  // 创建页面样式文件
  const scssContent = `.${moduleName}-${page} {
  min-height: 100vh;
  background-color: #f5f5f5;

  &-content {
    padding: 20px;
  }

  &-title {
    font-size: var(--font-size-large);
    font-weight: bold;
    margin: 30px 0;
    text-align: center;
  }
}`;
  fs.writeFileSync(path.join(pagePath, 'index.scss'), scssContent);
  console.log(`创建文件: ${path.join(pagePath, 'index.scss')}`);

  // 创建页面组件文件
  const componentName = `${toPascalCase(moduleName)}${page !== 'index' ? toPascalCase(page) : ''}Page`;
  const vueContent = `<template>
  <view class="${moduleName}-${page}">
    <view class="${moduleName}-${page}-content container">
      <view class="${moduleName}-${page}-title">
        <text class="text-primary">${toPascalCase(moduleName)}${page !== 'index' ? ' ' + toPascalCase(page) : ''}</text>
      </view>
      <view class="mt-4 flex justify-center" v-if="${toCamelCase(moduleName)}Store.loading">
        <loading text="加载中..." />
      </view>
    </view>
  </view>
</template>

<script lang="ts">
export default {
  name: '${componentName}'
}
</script>

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import Loading from '@/components/common/Loading.vue';
import { use${toPascalCase(moduleName)}Store } from '../store';

// 使用模块状态
const ${toCamelCase(moduleName)}Store = use${toPascalCase(moduleName)}Store();

// 初始化数据
onMounted(() => {
  ${toCamelCase(moduleName)}Store.fetchData();
});

// 页面卸载时重置状态
onUnmounted(() => {
  // 如果是模块主页，卸载时重置状态
  ${page === 'index' ? `${toCamelCase(moduleName)}Store.resetState();` : '// 子页面一般不重置模块状态'}
});
</script>

<style lang="scss">
@import './index.scss';
</style>`;
  fs.writeFileSync(path.join(pagePath, 'index.vue'), vueContent);
  console.log(`创建文件: ${path.join(pagePath, 'index.vue')}`);

  // 添加到需要更新app.config.ts的路径列表
  pagesToAdd.push(`pages/${moduleName}/${page}/index`);
}

// 更新app.config.ts，添加新页面
if (pagesToAdd.length > 0) {
  const appConfigPath = path.join(__dirname, '../src/app.config.ts');
  let appConfig = fs.readFileSync(appConfigPath, 'utf8');
  let updated = false;

  // 在pages数组中添加新页面
  pagesToAdd.forEach(pagePath => {
    if (!appConfig.includes(`'${pagePath}'`)) {
      appConfig = appConfig.replace(
        /pages\s*:\s*\[([\s\S]*?)\]/,
        (match, pagesList) => {
          // 保持原有缩进风格
          const indent = pagesList.match(/^\s*/)[0];
          return `pages: [${pagesList},\n${indent}'${pagePath}'\n${indent.slice(0, -2)}]`;
        }
      );
      console.log(`已更新 app.config.ts，添加页面路径: ${pagePath}`);
      updated = true;
    }
  });

  if (updated) {
    fs.writeFileSync(appConfigPath, appConfig);
  }
}

console.log(`\n✅ ${moduleName} 模块${pages.length > 1 ? `及${pages.length}个页面` : ''}创建成功！`);
console.log(`模块路径: src/pages/${moduleName}/`);
console.log('\n你还需要:');
console.log(`1. 检查并完善模块级组件、服务和状态管理`);
console.log(`2. 实现各页面的具体功能`);
console.log(`3. 如果需要在模块间共享数据，考虑创建全局状态`);
